//trie树,字典树,前缀树,,都是同一颗树,哈希树的变种
常用于文本的词频统计
它的特点就是,空间占用小,查询快
它的存储方式如下图所示
对于从树的根节点走到每一个黑色节点所经过的路径,如果将路径上的字母都连起来的话,就都对应着词典中的一个单词
trie树,分别有插入,查询和删除3种操作,插入时,需要把经过的每个节点的所存的num值,(p.s. num表示经过这个节点的字符串个数)
删除时,就要把对应的num减一,如果num为0,自然就要删除掉这个节点
而查询就比较简单了
下面贴代码
#include <bits/stdc++.h>
using namespace std;
typedef struct Node
{
int num;
int kuan;
Node* next[30];
char data;
Node(){
num=1;
kuan=0;
for (int i=0;i<30;i++) next[i]=NULL;
}
}*LinkNode;
struct Trie
{
LinkNode head;
Trie(){
head = new Node;
}
void insert(char str[]){
LinkNode node=head;
int len=strlen(str);
int i=0;
while(i<len){
int flags=0;
for (int k=0;k<node->kuan;k++){
if (node->next[k]->data-str[i]==0){
node=node->next[k];
node->num++;
flags=1;
break;
}
}
if (!flags){
node->next[node->kuan]=new Node;
node->next[node->kuan++]->data=str[i];
node=node->next[node->kuan-1];
}
i++;
}
}
int find(char str[]){
int len=strlen(str);
LinkNode node = head;
int i=0;
while(i<len){
int flags=0;
for (int k=0;k<node->kuan;k++){
if (node->next[k]->data-str[i]==0){
node=node->next[k];
flags=1;
break;
}
}
if (!flags) return 0;
if (i==len-1){
return node->num;
}
i++;
}
}
};
int main()
{
Trie tree;
int n;scanf("%d",&n);
for (int i=0;i<n;i++){
char a[100];
scanf("%s",a);
tree.insert(a);
}
scanf("%d",&n);
for (int i=0;i<n;i++){
char a[100];
scanf("%s",a);
printf("%d\n",tree.find(a));
}
return 0;
}